const str=1;
/** https://leetcode.cn/problems/valid-palindrome/
是否回文
三种解法：
字符串反转 o(n)
双指针 o(n)-推荐解法
栈 o(n) -
 */
        /**
         * 解题思路：把整个字符串反转，然后做比较
         * o(n)
         * @param {number} x
         * @return {boolean}
         */
        var isPalindrome1 = function(x) {
            const str=String(x);
            let reverse='';
            for(let i=str.length-1;i>-1;i--){
                reverse+=str[i];
            }
           
            return reverse==str? true:false;
        };

     

         /**
         * 解题思路：截取中间位，然后把左边和右边对比
         * 比整个字符串对比快1倍
         * o(n/2)
         * @param {number} x
         * @return {boolean}
         */
         var isPalindrome = function(x) {
             
            const str=String(x);
            const isEven=str.length%2 ===0
            let midIndex=Math.floor(str.length/2);
            let lefStr=str.substring(0,midIndex);
            let rightStr=''
            for(let i=str.length-1;isEven?i>=midIndex:i>midIndex;i--){
                rightStr+=str[i];
            }
            console.log(isEven,midIndex,lefStr,rightStr)
            return lefStr==rightStr;
        };

    


                 /**
         * 截取中间位，然后把左边和右边对比，如果有不对称直接返回结果
         * O(log n)
         * @speed 68 ms
         * @param {number} x
         * @return {boolean}
         */
         var isPalindrome2 = function(x) {
            let str=getLetters(x);
            let length=str.length;
            let isEven=length%2==0;
            let mid=0;
            let left=0;
            let right=0;
            if(isEven){
                mid=length/2;
                left=mid-1
                right=mid
            }else{
                mid=Math.floor(length/2);
                left=mid-1
                right=mid+1
            }
          
           
            while(left>=0){
               console.log(str[left],str[right])
                if(str[left]!==str[right]){
                    return false;
                }
                left--;
                right++;
            }
             return true;
         };

        //  console.log(isPalindrome2('aabb'))
        //  console.log(isPalindrome2('aba'))
        //  console.log(isPalindrome2('bbb'))
        //  console.log(isPalindrome2('bb'))
        //  console.log(isPalindrome2("0P"))
        //  console.log(isPalindrome2('P'))
        //  console.log(isPalindrome2('"A man, a plan, ad canal: Panama"'))

        // 格式化字符串，只取英文和数字
         function getLetters(s){
            res=s.replace(/[^a-zA-Z\d]/g,'').toLowerCase()
            console.log(res);
            return res;
         }
       


             /**
         * 推荐解法
         * 解题思路：从字符串的最两边往中间比较，不一样就返回false
         * o(n/2)
         * @param {number} x
         * @return {boolean}
         */
             var isPalindrome3 = function(x) {
                let left=0;
                let right=x.length-1;
                
               while(left<right){
                console.log(left,right)
                    if(x[left]!==x[right]){
                        return false;
                    }
                    left++;
                    right--;
               }
               
                return true;
            };

              console.log(isPalindrome3('aabb'))
         console.log(isPalindrome3('fffff'))
         console.log(isPalindrome3('abc'))
       

            //栈解法：还没写，大概意思就是把字符串的前半截放到一个栈里，然后再拿出来一个个和后半截比较
         var isPalindrome4 = function(x) {
            let left=0;
            let right=x.length-1;
            
           while(left<right){
            console.log(left,right)
                if(x[left]!==x[right]){
                    return false;
                }
                left++;
                right--;
           }
           
            return true;
        };